import socket
import time
import threading

client = ''

def sendhandle():
    while True:
        global client
        if client == '':
            continue
        print("等待输入：")
        cmd = input()
        send_data = cmd.encode()
        client.send(send_data)

def clienthandle(tcp_client, tcp_client_address):
    print("客户端的ip地址和端口号:", tcp_client_address)
    while True:
        # 接收客户端发送的数据, 这次接收数据的最大字节数是1024
        recv_data = tcp_client.recv(1024)
        print(recv_data)
        
        # 6 有消息就回复数据，消息长度为0就是说明客户端下线了
        if recv_data:
            print("客户端是:", tcp_client_address)
            print("客户端发来的消息是:", recv_data.decode())
        else:
            print("%s 客户端下线了..." % tcp_client_address[1])
            tcp_client.close()
            break
    

    # 准备要发送给服务器的数据
    # send_data = "好的，消息已收到".encode(encoding = "utf-8")
    # 发送数据给客户端
    # tcp_client.send(send_data)

def tcp_server():
    global client
    #设置ipv4，和tcp协议类型
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用，让程序退出端口号立即释放，否则的话在30秒-2分钟之内这个端口是不会被释放的，这是TCP的为了保证传输可靠性的机制。
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    server.bind(("",7777))
    server.listen(5)
    print("tcp服务器开启")
    thd2 = threading.Thread(target=sendhandle, args=(client))
    thd2.setDaemon(True)
    thd2.start()

    while True:
        # 等待客户端建立连接的请求, 只有客户端和服务端建立连接成功代码才会解阻塞，代码才能继续往下执行
        # 1. 专门和客户端通信的套接字： tcp_client
        # 2. 客户端的ip地址和端口号： tcp_client_address
        tcp_client, tcp_client_address= server.accept()
        client = tcp_client
        thd = threading.Thread(target=clienthandle, args=(tcp_client, tcp_client_address))
    
        thd.setDaemon(True)
        thd.start()
        
    server.close()

tcp_server()

